#include <stdio.h>
#include <stdlib.h>
#include <sched.h>
#include <errno.h>

/*
 * int sched_setparam(pid_t pid, const struct sched_param *param);
 * 
 * int sched_getparam(pid_t pid, struct sched_param *param);
 * 
 * struct sched_param {
 * 	...
 * 		int sched_priority;
 * 	...
 * };
 * 
 * DESCRIPTION
 * sched_setparam()  sets the scheduling parameters associated with the scheduling policy for the process identified by pid.  If pid is zero, then the parameters of the
 * calling process are set.  The interpretation of the argument param depends on the scheduling policy of the process identified by pid.  See sched_setscheduler(2)  for
 * a description of the scheduling policies supported under Linux.
 * 
 * sched_getparam() retrieves the scheduling parameters for the process identified by pid.  If pid is zero, then the parameters of the calling process are retrieved.
 * 
 * sched_setparam()  checks  the  validity  of  param  for  the  scheduling  policy  of the process.  The value param->sched_priority must lie within the range given by
 * sched_get_priority_min(2) and sched_get_priority_max(2).
 * 
 * For a discussion of the privileges and resource limits related to scheduling priority and policy, see sched_setscheduler(2).
 * 
 * POSIX systems on which sched_setparam() and sched_getparam() are available define _POSIX_PRIORITY_SCHEDULING in <unistd.h>.
 * 
 * RETURN VALUE
 * On success, sched_setparam() and sched_getparam() return 0.  On error, -1 is returned, and errno is set appropriately.
 * 
 * ERRORS
 * EINVAL The argument param does not make sense for the current scheduling policy.
 * 
 * EPERM  The calling process does not have appropriate privileges (Linux: does not have the CAP_SYS_NICE capability).
 * 
 * ESRCH  The process whose ID is pid could not be found.
 */



int main(int argc, const char * argv[])
{
	if(argc != 3)
	{
		printf("Usgae: %s <pid> <prio>\n", argv[0]);
		exit(1);
	}
	int pid = atoi(argv[1]);
	if(pid == 0)
	{
		pid = getpid();
	}  
	struct sched_param param;
	param.sched_priority = atoi(argv[2]);
	int ret = sched_setparam(pid, &param);
	if(-1 == ret)
	{
		switch(errno)
		{
			case EINVAL:
				printf("The argument param does not make sense for the current scheduling policy.\n");
				break;
			case EPERM:
				printf("The calling process does not have appropriate privileges (Linux: does not have the CAP_SYS_NICE capability).\n");
				break;
			case ESRCH:
				printf("The process whose ID is pid could not be found.\n");
				break;
			default:
				break;

		}
		return 1;
	}
	else
	{
		printf("pid: %d | priority set to: %d\n", pid, param.sched_priority);
		return 0;
	}
}
